public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
//        System.out.println(s.missingNumber(new int[]{0,1}));
        System.out.println(s.singleNumber(new int[]{2, 2, 3, 2}));
    }

    public int missingNumber(int[] nums) {
        /**
         * 丢失的数字
         * 解法：
         *  可以使用高斯定理，也可使用异或，此处使用异或*/
        // 1 预处理
        int n = nums.length;

        // 2 执行逻辑
        int ret = 0;
        // -从0~n异或
        for(int i = 1; i <= n; i++) {
            ret ^= i;
        }
        // -继续异或所有元素，最终值就是缺失值（消消乐）
        for(int e: nums) {
            ret ^= e;
        }

        // 3 返回值
        return ret;
    }

    public int singleNumber(int[] nums) {
        /**
         * 只出现一次的数字Ⅱ
         *  对bit位进行计数*/
        // 1 预处理
        int n = nums.length;
        int ret = 0;

        // 2 循环并设置
        for(int i = 0; i < 32; i++) {
            // -累加计算比特位1的个数
            int count = 0;
            for(int e: nums) {
                count += ((e>>i)&1);
            }
            count %= 3;
            // -根据累加结果设置最终结果
            if(count == 1) {
                ret |= (1<<i);
            }
        }

        // 3 返回值
        return ret;
    }
}
